/**
 * Copyright (c) 2010, Casey Lai
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 * 
 * Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 * 
 * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation and/or
 * other materials provided with the distribution.
 * 
 * Neither the name of the Cheetah Group nor the names of its contributors may be
 * used to endorse or promote products derived from this software without specific
 * prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
 * OF SUCH DAMAGE.
 */

package org.cheetahworkflow.designer.part;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import org.cheetahworkflow.designer.figure.ModuleRectangleFigure;
import org.cheetahworkflow.designer.figure.SequenceRectangleFigure;
import org.cheetahworkflow.designer.figure.SwitchDiamondFigure;
import org.cheetahworkflow.designer.model.ModuleNode;
import org.cheetahworkflow.designer.model.Node;
import org.cheetahworkflow.designer.model.SequenceNode;
import org.cheetahworkflow.designer.model.SwitchNode;
import org.cheetahworkflow.designer.policy.NodeDirectEditPolicy;
import org.cheetahworkflow.designer.policy.NodeEditPolicy;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.gef.tools.DirectEditManager;
import org.eclipse.jface.viewers.TextCellEditor;


public abstract class NodePart extends AbstractGraphicalEditPart implements PropertyChangeListener {
	
	protected DirectEditManager manager;

    public void performRequest(Request req) {
        if (req.getType().equals(RequestConstants.REQ_DIRECT_EDIT)) {
            if (manager == null) {
                Figure figure = (Figure) getFigure();
                manager = new NodeDirectEditManager(this, TextCellEditor.class, new NodeEditLocator(figure));
            }
            manager.show();
        }
    }

	@Override
	protected void createEditPolicies() {
		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new NodeDirectEditPolicy());
        installEditPolicy(EditPolicy.COMPONENT_ROLE, new NodeEditPolicy());
	}

	@Override
	public void propertyChange(PropertyChangeEvent event) {
		String propName = event.getPropertyName();
		if (Node.PROP_LOCATION.equals(propName)) {
			refreshVisuals();
		} else if (Node.PROP_SIZE.equals(propName)) {
			refreshVisuals();
		} else if (Node.PROP_CAPTION.equals(propName)) {
			refreshVisuals();
		}
	}
	
	@Override
	public void activate() {
        if (isActive()) {
            return;
        }
        super.activate();
        ((Node) getModel()).addPropertyChangeListener(this);
    }

	@Override
    public void deactivate() {
        if (!isActive()) {
            return;
        }
        super.deactivate();
        ((Node) getModel()).removePropertyChangeListener(this);
    }
	
	@Override
	protected void refreshVisuals() {
		Node node = (Node) getModel();
        Point location = node.getLocation();
        Dimension size = node.getSize();
        Rectangle rectangle = new Rectangle(location, size);
        
        IFigure figure = getFigure();
        ((GraphicalEditPart) getParent()).setLayoutConstraint(this, figure, rectangle);
        if (figure instanceof SequenceRectangleFigure) {
        	((SequenceRectangleFigure) figure).setCaption(((SequenceNode) getModel()).getCaption());
        } else if (figure instanceof SwitchDiamondFigure) {
        	((SwitchDiamondFigure) figure).setCaption(((SwitchNode) getModel()).getCaption());
        } else if (figure instanceof ModuleRectangleFigure) {
        	((ModuleRectangleFigure) figure).setCaption(((ModuleNode) getModel()).getCaption());
        }
    }

	protected abstract IFigure createFigure();
}
